[UPDATE] AWS Elemental MediaConvertのVideo scaling behaviorで設定可能なスケーリングモードが増えました!
はじめに
清水です。re:Invent 2023の真っ最中ですが、期間前に発表されたAWS Media Servicesのアップデートも抑えておこうのコーナーです。本エントリではAWS Elemental MediaConvertのVideo scaling behaviorで設定可能なスケーリングモードが追加されたアップデートについてお伝えします。AWS What's Newへのポストはありませんが、MediaConvert User Guideに2023/11/10付で追記されたアップデートとなります。
Document history for User Guide - MediaConvert
今回のアップデートにあわせて、User Guideには「Video scaling behavior and aspect ratios - MediaConvert」のページが新設されています。
入力映像と出力映像のアスペクト比や解像度が異なる場合の動作を設定するScaling behavior、これまではDefault (Fit with padding)
とStretch to output
の2種のみが選択可能でした。例えば入力がPortrait(縦長)に対して、出力設定がLandscape(横長)の場合など、ユースケースによってはこの2種のみだと変換時に追加の設定が必要になる、ということがありました。
- AWS Elemental MediaConvertを使ってスマホで撮影した縦長動画を上手にHLS形式に変換してみる | DevelopersIO
-
amazon elastic transcoder - MediaConvert remove black bars - Stack Overflow
今回のアップデートでは、Fit
、Fit without upscaling
、そしてFill
の3つのスケーリングモードが追加されました。これまで課題だったPortraitの入力に対して出力設定がLandscapeというような場合でも、変換後に違和感のない映像が得られます。
それぞれのスケーリングモードでの動作のようすは、User Guideの「Video scaling behavior and aspect ratios」に図とともに詳しく説明されているので詳細は割愛します。本エントリではPortrait(縦長)の入力に対してLandscape(横長)の出力設定をしてある状況下にて、Scaling behaviorの設定の違いでどのような出力が得られるかを確認してみたのでまとめたいと思います。
Video scaling behaviorの新しいスケーリングモードを試してみた
では実際に、MediaConvertに追加された新しいスケーリングモード、Fit
、Fit without upscaling
、Fill
をそれぞれ確認していきいます。あわせて、これまでのDefault (Fit with padding)
ならびにStretch to output
の挙動についても確認してみます。
入力映像と出力映像の設定について
入力映像は解像度がwidth: 1080, height: 1920
のPortrait (9:16)な動画ファイルを準備しました。井の頭線の電車をスマホで撮影したものですね。
出力の際の解像度設定としてはwidth: 1280, height: 720
を指定してみます。Landscape (16:9)な解像度ですね。MediaConvert User Guideの「Video scaling behavior and aspect ratios」の表中、Conditionの「 Input width less than output width. Input height greater than output height. 」の条件に合致する変換となります。
Scaling behaviorごとのJobを作成
MediaConvertでScaling behaviorごとのJobを作成してきます。
Default (Fit with padding)
まずはDefault (Fit with padding)
用のJobです。[Create Job]から進み、入力ファイルのS3 URLを入力したら、Output groupsを[Add]します。今回はFile groupを選択しました。
出力先のパスとなるDestinationを入力、またOutputsのName modifierも設定します。(ここをScaling behaviorの設定ごとに変更し、出力ファイルを区別してきます。)P
Detailsに進み、Extensionで「mp4」を指定します。 Encoding settingsでWidthとHeightを1280x720としました。 Max bitrateは「5000000 (bits/s)」を指定します。
Scalingの項目のScaling behaviorでDefault (Fit with padding)
を選びます。
以上でJobを作成します。
Stretch to output
続いてStretch to output
用のJobです。Default (Fit with padding)
用のJobを[Duplicate]して、OutputsのName modifier`を変更します。
Scalingの項目のScaling behaviorでStretch to output
を選び、Jobを作成します。
Fit
Fit
用のJobも、Stretch to outputと同様に[Duplicate]して進めます。OutputsのName modifierを変更たら、Scalingの項目のScaling behaviorでFit
を選択します。
Fit without upscaling
Fit without upscaling
用のJob作成も同様です。Scalingの項目のScaling behaviorでFit without upscaling
を選択します。
Fill
Fill
用のJobも同様の手順です。Scaling behaviorでFill
を選択します。これですべてのScaling behavior用のJobが作成できました。
Scaling behaviorごとの変換後の出力映像の解像度を確認
Scaling behaviorごと5つのJobが完了したら、S3に出力されている変換後の映像を確認していきます。
Default (Fit with padding)
まずはDefault (Fit with padding)
の設定です。左右に黒い帯ができてしまっていることが確認できますね。出力された映像の解像度は1280x720
です。
Stretch to output
続いてStretch to output
の設定です。Default (Fit with padding)
とは異なり、左右への黒い帯は発生していませんが、出力後の解像度に合わせて映像が引き伸ばされてしまっていることがわかります。出力された映像の解像度は1280x720
です。
Fit
続いて今回のアップデートの1つ、Fit
の設定です。変換後の映像がPortrait (9:16)な比率を維持した解像度になっています!実際の解像度は406x720
となり、Jobで設定したheight
を基準に9:16なPortraitになっていることがわかります。
Fit without upscaling
続いてもアップデートで追加された設定の1つ、Fit without upscaling
の設定です。こちらもFit
と同様に、変換後の映像はJobで指定したheight
を基準にした、9:16な406x720
解像度のPortraitとして出力されていることがわかります。今回は入力のheight
が出力のheight
よりも大きい(入力が1920
、出力が720
)という条件でしたが、逆(入力のheight
が出力のheight
よりも小さい)場合には、Fit
とFit without upscaling
で出力に違いが出てくる、という認識です。
Fill
最後に、アップデートで追加された設定の1つのFill
です。16:9なLandscapeな映像に変換されています。しかし、左右に黒帯ができたDefault (Fit with padding)
や映像が引き伸ばされてしまったStretch to output
と異なり、入力映像の中心部分のみが残り上下が切り取られる、クロッピングされた映像になっていることがわかります。入力映像が解像度が1080x1920
で出力された映像の解像度は1280x720
ですので、width
の1280
を基準に少し拡大していることになりますね。
Amazon Elastic Transcoderにのみ搭載されていた機能がMediaConvertにも追加された!?
MediaConvertのVideo scaling behaviorに新たに追加された3つのスケーリングモード、Fit
、Fit without upscaling
、そしてFill
の違いを、これまでのDefault (Fit with padding)
ならびにStretch to output
の結果とあわせて確認してきました。
実際の変換のパターンについては、繰り返しになりますがMediaConvert User Guideの「Video scaling behavior and aspect ratios」の項目の図を確認しましょう。パターンごとにどのような変換になるのかが網羅されています。
Video scaling behavior and aspect ratios - MediaConvert
さて、上記の図(人形のアイコン)と各モードごとの変換パターンの内容などを確認していくと、「あれ?あのサービスのドキュメントにもこんなページあったよな?」と気がつくかと思います。そう、2017年11月のre:Invent 2017でAWS Elemental MediaConvert含むAWS Media Servicesが発表されるまで、AWSの動画変換サービスならこれ!だったAmazon Elastic Transcoderですね。
改めてElastic TranscoderのDeveloper Guideを確認してみましょう。やっぱり!同じ図(人形のアイコン)が使われていました。またこのページから、Elastic TranscoderにはFit
やFill
などの設定が可能であったことがわかります。(設定パターンとしてはElastic Transcoderのほうが多そうですね。)
Sizing Policy and Aspect Ratios - Amazon Elastic Transcoder
今回のMediaConvertでのアップデート、今となっては数少ないElastic Transcoderにだけ設定できる機能の1つがMediaConvertにも設定できるようになった、と言えるかもしれません。ただ例えば以下のように、これまでMediaConvert単体では設定できなかっただけでLambdaなどとの連携で目的は果たせていた、という認識です。とはいえ、MediaConvertのみの設定だけで実現可能になったのは嬉しいアップデートかと思います。
まとめ
MediaConvertのVideo scaling behaviorで新たに追加された3つのスケーリングモードについて確認してみました。本文中でも触れましたが、例えば縦長動画から横長動画への変換などでは、違和感のない映像(黒帯がない、引き伸ばされていない)を得るために一工夫必要でした。
今回追加されたスケーリングモードを上手に活用することで、縦横比が変わる変換でも違和感のない映像が容易に得られます。また下記エントリのような、縦横比の変換のためにクロッピングを行っていた、という場合にもFill
の設定を使うことで自動的に処理ができるようになるかと思います。
比率が変わる変換では重宝するアップデートですね。上手に活用していきたいと思いました。